package com.cxs.serviceabilitydemo.connections;

import ohos.rpc.*;

// 发起连接侧的代理
public class MyRemoteProxy implements IRemoteBroker {
    // 开发者约定的两端用来确认身份的code
    static final int COMMAND_PLUS = IRemoteObject.MIN_TRANSACTION_ID;
    // 开发者约定的两端用来确认身份的code
    static final int COMMAND_METHOD1 = IRemoteObject.MIN_TRANSACTION_ID + 1;
    // 开发者约定的通信成功的code值
    static final int ERR_OK = 0;
    final IRemoteObject remoteObject;

    // 用构造器初始化远端代理对象，最终是靠onAbilityConnectDone接口方法返回来获取
    public MyRemoteProxy(IRemoteObject remoteObject) {
        this.remoteObject = remoteObject;
    }

    @Override
    public IRemoteObject asObject() {
        return remoteObject;
    }

    // 下面的方法就是我们的Service Ability的功能
    // 是在远端实现a和b的相加
    public int plus(int a, int b) {
        // 传出去的数据
        MessageParcel data = MessageParcel.obtain();
        // 从远端执行完后返回的结果
        MessageParcel reply = MessageParcel.obtain();
        // option不同的取值，决定采用同步或异步的方式跨设备控制PA
        MessageOption option = new MessageOption(MessageOption.TF_SYNC);

        // writeInt一次指针就向后移动一位
        data.writeInt(a);
        data.writeInt(b);

        int result = 0;

        try {
            remoteObject.sendRequest(COMMAND_PLUS, data, reply, option);
            // 取出返回的数据队列的第一条数据,读取一次指针就向后移动一位
            int errCode = reply.readInt();
            // 判断是否和两端约定的通信成功的code值相等
            if (errCode != ERR_OK) {
                throw new RemoteException();
            }
            result = reply.readInt();
        } catch (RemoteException e) {
            e.printStackTrace();
        } finally{
            // 清除不再使用的MessageParcel对象
            data.reclaim();
            reply.reclaim();
        }
        return result;
    }
}
